This page last changed on Jun 18, 2004 by plightbo.

编写组件类

XWork中, 组件类可以是你希望的任何事物. 唯一的约束是必须有一个具体(concrete)类, 它有一个缺省构造函数, 这样XWork才能创建实例. 组件可以实现Initializable和Disposable接口这样在创建后核销会前可以接受到生命周期事件. 这很简单:
public class MyComponent implements Intializable, Disposable {
    public void init () {
         //do initialization here
    }

    public void dispose() {
         //do any clean up necessary before garbage collection of this component
    }
}

组件依赖

一个不那么明显的特性是组件可以依赖于其他组件. 例如: 如果ExchangeRateService依赖于Configuration组件, XWork将在ExchangeRateService初始化后向它传递Configuration组件实例. 注意, XWork自动以正确的顺序初始化组件, 如果A是一个依赖于B和C的组件或活动, B依赖于C, 如果A, B, C之前没有被初始化, ComponentManager将使用下面的顺序:
  1. 初始化C, 如果C实现了Initializable就调用init()方法.
  2. 初始化B, 并使用enabler方法设置C.
  3. 如果B实现了Initializable就调用init()方法.
  4. 调用B的enabler方法将B设置到A.

当然, 如果B或C的实例已经存在则将在本例中复用, 示例将直接传递到A中 .

编写Enabler

Enabler只能有一个方法, 方法只接受一个参数. 参数类型应当是所需的组件的类型或者组件的父类型. XWork不关心enabler方法名称.

下列展示ExchangeRateAware可能使用的代码:

public interface ExchangeRateAware {
    public void setExchangeRateService(ExchangeRateService exchangeRateService);
}

注意enabler通常是一个接口, 当然也没有阻止你选择使用类.

编写"Enabler-aware"的活动

活动类需要做的是实现相应的enabler接口. XWork随后将在活动执行前调用它的enabler方法. 下面是一个简单的例子:

public class MyAction extends ActionSupport implements ExchangeRateAware {
    ExchangeRateService ers;
    
    public void setExchangeRateService(ExchangeRateService exchangeRateService) {
        ers = exchangeRateService;
    }
    
    public String execute() throws Exception {
        System.out.println("The base currency is " + ers.getBaseCurrency());
    }
}

如果一个对象既不是活动也不是组件, 你必须显示调用componentManager.initializeObject(enabledObject)通知XWork为该对象提供所需的组件;

使用外部引用处理器(resolver)

在XWork也可以使用外部引用处理器, 也就是说, 不由XWork自己处理引用. 一个例子是使用外部引用处理器将XWork和Spring Framework集成起来.

只需要编写一个外部引用处理器并在package声明中告诉XWork去使用它:
<package
    name="default"
    externalReferenceResolver="com.atlassian.xwork.ext.SpringServletContextReferenceResolver">

现在, 为了使用外部引用你需要使用类似下面的方法:
<external-ref name="foo">Foo</external-ref>

在这里, name属性是setter方法的名称, Foo是需要查找的引用名称.

关于集成的更多细节和样例代码, 请查看com.opensymphony.xwork.config.ExternalReferenceResolver类的JavaDoc(不幸的是没有在线信息)以及XW-122

-Chris
Document generated by Confluence on Dec 14, 2004 16:37